package com.hspedu.web.datavalid;

import com.hspedu.web.datavalid.entity.Monster;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.validation.Errors;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.validation.Valid;
import java.util.List;
import java.util.Map;
@Controller
@Scope("prototype")//每次请求会生成一个新的MonsterHandler对象
public class MonsterHandler {
    @RequestMapping("/addMonsterUI")
    //Map<String,Object> map当向map添加数据会默认存放到request域中
    public String addMonsterUI(Map<String,Object> map){
        //要跳转的页面使用了springmvc标签，那么就需要准备一个对象放入request域中
        map.put("monster",new Monster());
        return "datavalid/monster_addUI";
    }
    //@RequestMapping("/save")
    ////如果校验出现错误会放在errors里面
    ////错误会放在map里面,同时会保存monster
    //public String save(@Valid Monster monster, Errors errors, Map<String,Object> map){
    //    System.out.println("-----monster----"+monster);
    //
    //    System.out.println("==========map===========");
    //    for (Map.Entry<String, Object> entry : map.entrySet()) {
    //        System.out.println("key="+entry.getKey()+" value="+entry.getValue());
    //    }
    //    System.out.println("========errors========");
    //    if (errors.hasErrors()){
    //        List<ObjectError> allErrors = errors.getAllErrors();
    //
    //        for (ObjectError allError : allErrors) {
    //            System.out.println("errors="+allError);
    //        }
    //        return "datavalid/monster_addUI";
    //    }
    //
    //    return "datavalid/success";
    //}
    //如果校验出现错误会放在errors里面
    //错误会放在map里面,同时会保存monster
    @RequestMapping(value = "/save")
    public String save(@Valid Monster monster, Errors errors, Map<String, Object> map) {
        System.out.println("----monster---" + monster);
        //我们为了看到验证的情况,我们输出map 和 errors
        System.out.println("===== map ======");
        for (Map.Entry<String, Object> entry : map.entrySet()) {
            System.out.println("key= " + entry.getKey() + " value=" + entry.getValue());
        }

        System.out.println("===== errors ======");
        if (errors.hasErrors()) {//判断是否有错误
            List<ObjectError> allErrors = errors.getAllErrors();
            for (ObjectError error : allErrors) {
                System.out.println("error=" + error);
            }
            return "datavalid/monster_addUI";
        }
        return "datavalid/success";
    }

    @InitBinder//取消绑定Monster的name表单提交的值给monster.name属性
    public void initBinder(WebDataBinder webDataBinder) {
        /**
         * 老师解读
         * 1. 方法上需要标注 @InitBinder  springmvc底层会初始化 WebDataBinder
         * 2. 调用 webDataBinder.setDisallowedFields("name") 表示取消指定属性的绑定
         *    即：当表单提交字段为 name时， 就不在把接收到的name值，填充到model数据monster的name属性
         * 3. 机制：springmvc 在底层通过反射调用目标方法时, 接收到http请求的参数和值,使用反射+注解技术
         *    取消对指定属性的填充
         * 4. setDisallowedFields支持可变参数，可以填写多个字段
         * 5. 如果我们取消某个属性绑定,验证就没有意义了,应当把验证的注解去掉, name属性会使用默认值null
         *  //@NotEmpty
         *  private String name;
         *
         */
        //webDataBinder.setDisallowedFields("name");
    }
}
